﻿using System;
using System.Configuration;
using System.IO;
using System.Net;
using System.Net.Configuration;
using System.Net.Mail;
using Vallejos.Entidades.Enums;
using Vallejos.Entidades.Interfaces;
using Vallejos.Entidades.ModeloDeDatos;
using System.Linq;

namespace Vallejos.Negocio
{
    public class EnvioCorreosBLL : IEnvioCorreos
    {
        private const string PLANTILLA_PREAPROBADO = "PreAprobado.htm";
        private const string PLANTILLA_APROBADO = "AprobacionSolAnalisis.htm";
        private const string PLANTILLA_RECHAZO_SOLIC = "SolicAnalisisRechazada.htm";
        private const string PLANTILLA_NUEVA_SOLICITUD_ANALISIS_ANALISTA = "NuevaSolicitudDeAnalisisParaAnalista.htm";
        private const string PLANTILLA_NUEVA_SOLICITUD_PRESTAMO_EJECUTIVO = "NuevaSolicitudDePrestamoParaEjecutivo.htm";

        public void NotificarAsignacionDeAnalista(SolicitudDeAnalisisCrediticio solicitud, string urlPath)
        {
            var titulo = string.Empty;
            var cuerpo = string.Empty;

            switch (solicitud.Estado.idEstado)
            {
                case IdEstadoAnalisis.AnalisisAutomatico:
                    break;
                case IdEstadoAnalisis.PreAprobada:
                    cuerpo = ObtenerCorreoParaNuevaSolicitudAnalizar(solicitud, urlPath);
                    titulo = "Nueva Solicitud Para Analizar";
                    break;
                case IdEstadoAnalisis.RechazoAutomatico:
                    break;
                case IdEstadoAnalisis.AnalisisManual:
                    break;
                case IdEstadoAnalisis.Aprobada:
                    break;
                case IdEstadoAnalisis.Rechazada:
                    break;
                default:
                    throw new ArgumentOutOfRangeException();
            }

            EnviarCorreo(solicitud.Beneficiario.Usuario.Email, titulo, cuerpo);
        }

        public void NotificarAsignacionDeEjecutivo(SolicitudDePrestamo solicitud, string urlPath)
        {
            var titulo = string.Empty;
            var cuerpo = string.Empty;

            switch (solicitud.Estado.idEstado)
            {
                case IdEstadoPrestamo.Nuevo:
                    cuerpo = ObtenerCorreoParaNuevaSolicitudAnalizar(solicitud, urlPath);
                    titulo = "Nueva Solicitud Para Analizar";
                    break;
                case IdEstadoPrestamo.EsperaDocumentacion:
                    break;
                case IdEstadoPrestamo.DocumentacionRecibida:
                    break;
                case IdEstadoPrestamo.EnCurso:
                    break;
                case IdEstadoPrestamo.RechazoTransitorio:
                    break;
                case IdEstadoPrestamo.Aprobada:
                    break;
                case IdEstadoPrestamo.Rechazada:
                    break;
                case IdEstadoPrestamo.PrestamoOtorgado:
                    break;
                default:
                    throw new ArgumentOutOfRangeException();
            }

            EnviarCorreo(solicitud.Beneficiario.Usuario.Email, titulo, cuerpo);
        }

        public void NotificarCambioDeEstadoDeSolicitud(SolicitudDeAnalisisCrediticio solicitud)
        {
           
            var titulo = string.Empty;
            var cuerpo = string.Empty;

            switch (solicitud.Estado.idEstado)
            {
                case IdEstadoAnalisis.AnalisisAutomatico:
                    break;
                case IdEstadoAnalisis.PreAprobada:
                    cuerpo = ObtenerCorreoParaPreAprobacion(solicitud);
                    titulo = "Credito Pre Aprobado";
                    break;
                case IdEstadoAnalisis.RechazoAutomatico:
                case IdEstadoAnalisis.Rechazada:
                    cuerpo = ObtenerCorreoParaRechazo(solicitud);
                    titulo = "Credito Rechazado";
                    break;
                case IdEstadoAnalisis.AnalisisManual:
                    break;
                case IdEstadoAnalisis.Aprobada:
                    cuerpo = ObtenerCorreoParaAprobacion(solicitud);
                    titulo = "Credito Aprobado";
                    break;
                default:
                    throw new ArgumentOutOfRangeException();
            }

            EnviarCorreo(solicitud.Beneficiario.Usuario.Email, titulo, cuerpo);
        }

        private string ObtenerCorreoParaPreAprobacion(SolicitudDeAnalisisCrediticio solicitud)
        {
            var plantilla =
               new StreamReader(System.String.Format(@"{0}PlantillasDeMail\{1}",
                                                 System.Threading.Thread.GetDomain().BaseDirectory, PLANTILLA_PREAPROBADO));
            var cuerpoSinProvesar = plantilla.ReadToEnd();
            var cuerpoProcesado = string.Format(cuerpoSinProvesar
                , solicitud.Beneficiario.DatosPersonales.Nombre
                , solicitud.Beneficiario.DatosPersonales.Apellido
                , solicitud.Producto.Marca.Nombre
                , solicitud.Producto.Modelo.Nombre
                , solicitud.Producto.Precio
                , solicitud.Monto
                , solicitud.TipoFinanciacion.Nombre);

            return cuerpoProcesado;
        }

        private string ObtenerCorreoParaAprobacion(SolicitudDeAnalisisCrediticio solicitud)
        {
            var plantilla =
               new StreamReader(System.String.Format(@"{0}PlantillasDeMail\{1}",
                                                 System.Threading.Thread.GetDomain().BaseDirectory, PLANTILLA_APROBADO));

            var telefono = solicitud.Producto.Concesionaria.DatosDeEmpresa.DatosDomiciliarios.Telefonos.SingleOrDefault(tel => tel.Tipo.idTipo == IdTipoTelefono.Fijo);
            var cuerpoProcesado = string.Format(plantilla.ReadToEnd()
                                                , solicitud.Beneficiario.DatosPersonales.Nombre
                                                , solicitud.Beneficiario.DatosPersonales.Apellido
                                                , solicitud.Producto.Marca.Nombre
                                                , solicitud.Producto.Modelo.Nombre
                                                , solicitud.Producto.Precio
                                                , solicitud.Monto
                                                , solicitud.TipoFinanciacion.Nombre
                                                , solicitud.Producto.Concesionaria.RazonSocialNombre
                                                , telefono == null ? string.Empty : telefono.Numero
                                                , solicitud.Producto.Concesionaria.DatosDeEmpresa.DatosDomiciliarios.Calle
                                                , solicitud.Producto.Concesionaria.DatosDeEmpresa.DatosDomiciliarios.Numero
                                                , solicitud.Id);

            return cuerpoProcesado;
        }

        private string ObtenerCorreoParaNuevaSolicitudAnalizar(SolicitudDeAnalisisCrediticio solicitud, string urlPath)
        {
            var plantilla =
               new StreamReader(System.String.Format(@"{0}PlantillasDeMail\{1}",
                                                 System.Threading.Thread.GetDomain().BaseDirectory, PLANTILLA_NUEVA_SOLICITUD_ANALISIS_ANALISTA));

            var cuerpoProcesado = string.Format(plantilla.ReadToEnd()
                , solicitud.Analista.DatosPersonales.Nombre
                , solicitud.Analista.DatosPersonales.Apellido
                , solicitud.Id
                , urlPath
                , solicitud.Id);

            return cuerpoProcesado;
        }

        private string ObtenerCorreoParaNuevaSolicitudAnalizar(SolicitudDePrestamo solicitud, string urlPath)
        {
            var plantilla =
               new StreamReader(System.String.Format(@"{0}PlantillasDeMail\{1}",
                                                 System.Threading.Thread.GetDomain().BaseDirectory, PLANTILLA_NUEVA_SOLICITUD_PRESTAMO_EJECUTIVO));

            var cuerpoProcesado = string.Format(plantilla.ReadToEnd()
                , solicitud.EjecutivoEncargado.DatosPersonales.Nombre
                , solicitud.EjecutivoEncargado.DatosPersonales.Apellido
                , solicitud.Id
                , urlPath
                , solicitud.Id);

            return cuerpoProcesado;
        }

        private string ObtenerCorreoParaRechazo(SolicitudDeAnalisisCrediticio solicitud)
        {
            var plantilla =
               new StreamReader(System.String.Format(@"{0}PlantillasDeMail\{1}",
                                                 System.Threading.Thread.GetDomain().BaseDirectory, PLANTILLA_RECHAZO_SOLIC));

            var cuerpoProcesado = string.Format(plantilla.ReadToEnd()
                , solicitud.Beneficiario.DatosPersonales.Nombre
                , solicitud.Beneficiario.DatosPersonales.Apellido
                , solicitud.Producto.Marca
                , solicitud.Producto.Modelo
                , solicitud.Producto.Precio
                , solicitud.Monto
                , solicitud.TipoFinanciacion.Nombre);

            return cuerpoProcesado;
        }

        private void EnviarCorreo(string para, string titulo, string cuerpo)
        {
            var configSMTP = (SmtpSection)ConfigurationManager.GetSection("mailSettings/smtp_1");
            var mMailMessage = new MailMessage
                                   {
                                       From = new MailAddress(configSMTP.From,"Banco Portugues"),
                                       Subject = titulo,
                                       Body = cuerpo,
                                       IsBodyHtml = true,
                                       Priority = MailPriority.Normal,
                                   };

            mMailMessage.To.Add(new MailAddress(para));

            var mSmtpClient = new SmtpClient(configSMTP.Network.Host, configSMTP.Network.Port)
                                  {EnableSsl = configSMTP.Network.EnableSsl, Credentials = new NetworkCredential(configSMTP.Network.UserName, configSMTP.Network.Password)};
            
            mSmtpClient.Send(mMailMessage);
        }
    }
}
